home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / extra / lock.a < prev    next >
Text File  |  1990-06-20  |  3KB  |  122 lines

  1.  
  2.         section text,CODE
  3.  
  4.         xref    _SysBase
  5.  
  6.         xref    _LVOSignal
  7.         xref    _LVOForbid
  8.         xref    _LVOPermit
  9.         xref    _LVOWait
  10.         xref    _LVOFindTask
  11.  
  12.         xdef    _LockAddr
  13.         xdef    _LockAddrB
  14.         xdef    _TryLockAddr
  15.         xdef    _TryLockAddrB
  16.         xdef    _UnlockAddr
  17.         xdef    _UnlockAddrB
  18.  
  19. _TryLockAddrB:    movem.l 4(sp),D0/A0
  20.         bra    TLA0
  21. _TryLockAddr:
  22.         move.l    4(sp),A0
  23.         moveq.l #0,D0
  24.  
  25. TLA0:        bset.b    D0,4(A0)                ; attempt to gain lock
  26.         bne    tla10            ; failure
  27.         moveq.l #1,D0
  28.         rts                ; success, return 1
  29. tla10        moveq.l #-1,D0            ; failure, return -1
  30.         rts
  31.  
  32. _LockAddrB:    movem.l 4(sp),D0/A0             ; bit: D0    lock: A0
  33.         bra    LA0
  34. _LockAddr:                    ; bit: 0     lock: A0
  35.         move.l    4(sp),A0
  36.  
  37.         ;    MAIN LOCK CODE
  38.  
  39.         moveq.l #0,D0
  40. LA0:        bset.b    D0,4(A0)                ; attempt to gain lock
  41.         bne    la10            ; failure
  42.         rts                ; success, done, rts (FAST)
  43.  
  44. la10        movem.l D2/A2/A6,-(sp)          ; failure (SLOW) (BLOCK)
  45.         move.l    _SysBase,A6        ; A6 = SYSBase
  46.         movem.l D0/A0,-(sp)
  47.         sub.l    A1,A1
  48.         jsr    _LVOFindTask(A6)
  49.         move.l    D0,D2
  50.         jsr    _LVOForbid(A6)
  51.         movem.l (sp)+,D0/A0
  52.         bset.b    D0,4(A0)                ; try again after FORBID
  53.         beq    la20            ; got it!
  54.  
  55.         ;   Put linked list structure on stack
  56.  
  57.         move.w    D0,-(sp)                ; bit#    12(sp)
  58.         move.l    D2,-(sp)                ; task#    8(sp)
  59.         move.l    A0,-(sp)                ; &var     4(sp)
  60.         move.l    (A0),-(sp)              ; Next      (sp)
  61.         move.l    sp,(A0)                 ; (put at head of list)
  62.  
  63.         ;   Loop Wait/re-attempt lock
  64.  
  65. la15        moveq.l #$10,D0         ; wait (semaphore signal)
  66.         jsr    _LVOWait(A6)
  67.  
  68.         move.w    12(sp),D0               ; try for lock
  69.         move.l    4(sp),A0
  70.         bset.b    D0,4(A0)
  71.         bne    la15            ; loop until get it
  72.  
  73. la16        cmp.l    (A0),sp                 ; unlink, find our node!
  74.         beq    la18
  75.         move.l    (A0),A0
  76.         bra    la16
  77. la18        move.l    (sp),(A0)
  78.         add.w    #14,sp
  79. la20
  80.         jsr    _LVOPermit(A6)
  81.         movem.l (sp)+,D2/A2/A6
  82.         rts
  83.  
  84.         xdef    _UnlockAddr
  85.         xdef    _UnlockAddrB
  86.  
  87. _UnlockAddrB:    movem.l 4(sp),D0/A0
  88.         bra    UL0
  89. _UnlockAddr:    move.l    4(sp),A0
  90.         moveq.l #0,D0
  91.  
  92. UL0:        bclr.b    D0,4(A0)                ; clear lock bit
  93.         move.l    (A0),D1                 ; anybody waiting?
  94.         beq    ulrts            ; no, rts
  95. ULW:
  96.         movem.l D2/A2/A6,-(sp)          ; yes, wake 'm all up
  97.         move.b    D0,D2            ; D2 = bit#
  98.         move.l    _SysBase,A6        ; A6 = SYSBase
  99.         movem.l D0/A0,-(sp)
  100.         jsr    _LVOForbid(A6)
  101.         movem.l (sp)+,D0/A0
  102.  
  103.         move.l    (A0),D1                 ; get pointer again after FORBID
  104.         beq    ul20            ; no, rts (close a window)
  105.  
  106. ul10        move.l    D1,A2            ; A2 = node
  107.         cmp.b    13(A2),D2               ; waiting on our bit #?
  108.         bne    ul18               ; no
  109.         move.l    8(A2),A1                ; yes, signal the node
  110.         moveq.l #$10,D0
  111.         jsr    _LVOSignal(A6)          ; signal EVERYONE waiting
  112. ul18        move.l    (A2),D1                 ; next
  113.         bne    ul10
  114.  
  115. ul20
  116.         jsr    _LVOPermit(A6)
  117.         movem.l (sp)+,D2/A2/A6
  118. ulrts        rts
  119.  
  120.         END
  121.  
  122.